// 对axios进行封装
// 1. 基地址
// 2. 请求拦截器
// 3. 响应拦截器

// 封装axios
import { Toast } from 'antd-mobile'
import axios, { AxiosError } from 'axios'
import store from '@/store'
import { saveToken } from '@/store/actions/login'
import { getToken, hasToken, removeToken } from './storage'
import history from '@/utils/history'

const BASE_URL = 'http://geek.itheima.net/v1_0/'
const instance = axios.create({
  baseURL: BASE_URL,
  timeout: 5000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 如果有token，就带上
    if (hasToken()) {
      // if(config.headers){
      //   config.headers.Authorization = 'Bearer ' + getToken().token
      // }

      // 非空断言
      config.headers!.Authorization = 'Bearer ' + getToken().token
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError<{message:string}>) {
    console.dir(error)
    // 是否有response，如果没有，说明网络有问题
    if (!error.response) {
      Toast.show({ content: '网络错误' })
      return Promise.reject(error)
    }
    // 有response,状态码不是401
    if (error.response.status !== 401) {
      Toast.show({ content: error.response.data.message || '请求错误' })
      return Promise.reject(error)
    }

    // 下面处理401错误
    // 判断有无refresh_token
    const { refresh_token } = getToken()
    if (!refresh_token) {
      // 没有 refresh_token
      // 删除所有的token信息
      removeToken()
      // 跳转到login
      // window.location.href="/login"

      // 如何在一个普通的ts模块中使用history？
      history.push('/login', { from: history.location.pathname })
      return Promise.reject(error)
    }

    try {
      // 1. 用refresh_token请求新token
      const res = await axios.put(`${BASE_URL}authorizations`, null, {
        headers: {
          Authorization: `Bearer ${refresh_token}`
        }
      })
      console.log('新token', res.data.data.token)
      // 2. 保存新token
      store.dispatch(saveToken({ refresh_token, token: res.data.data.token }))

      // 3. 重发请求
      return instance(error.config)
    } catch (err) {
      // 删除所有的token信息
      removeToken()
      // 跳转到login
      // window.location.href="/login"
      history.push('/login', { from: history.location.pathname })
      return Promise.reject(error)
    }
  }
)

export default instance
